使用got装饰器制作比赛抽图系统

使用got装饰器制作比赛抽图系统

三月 24, 2023

反思

说实话,这段代码并不完美,got装饰器有专门的获取消息的方法,而我仍然在使用获取事件消息的方式。

而这种实现方法最明显的缺陷就是无法在群聊以外的环境中使用。

阅读了其他人的代码后,我深感自己的代码水平还是太低。尽管投机取巧的实现了一些功能,但很明显的存在诸多的缺陷。

我将在接下来的时间内多多参考佬们的代码,也更多的去理解Python。汲取前人的智慧,追寻前辈的脚步,而不是一直通过自己的方法闭门造车。

统计一下存在缺陷的功能:

​ 教学系统:大量的使用json文件,占用的资源太多

​ 持续性会话系统:发送了空消息,影响PC用户的使用

​ 比赛系统:代码不完美

​ 抽图系统:代码重复性高,宛若屎山

​ 帮助系统:同上

总结:菜!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
import random
from pathlib import Path
from nonebot import on_command
from nonebot.adapters.onebot.v11 import MessageSegment, Event
from nonebot.matcher import Matcher
from nonebot.adapters import Message
from nonebot.params import CommandArg

MatchMap = on_command('比赛抽图模式启动', priority=50)


@MatchMap.handle()
async def handle_first_receive(matcher: Matcher, args: Message = CommandArg()):
plain_text = args.extract_plain_text()
if plain_text:
matcher.set_arg("Map", args)
# 设置一个got消息


# 这里Ban图
MapList = os.listdir(os.getcwd() + "/love/data/images/match/")


@MatchMap.got("Map",
prompt=f"当前地图池为{str(MapList).replace('.png', '')}\nBan图指【BanXXX】\nBan图结束请发送【开始抽图】")
async def handle_func(event: Event):
# async def handle_city(Map: Message = Arg(), BanMap: str = ArgPlainText("Map")):
try:
MapName = str(event.get_message()).replace('Ban', '')

if MapName != '开始抽图':

MapList.remove(MapName + '.png')

await MatchMap.reject("Ban图成功,地图池中还有:" + str(MapList).replace('.png', ''))

else:
await MatchMap.send("Ban图结束,最终地图池中还有:" + str(MapList).replace('.png', '') + "这些地图")
except:
await MatchMap.reject("请检查指令是否正确~")


@MatchMap.got("Number", prompt=f"请发送需要抽取地图的数量,如果抽1张图请发送 1 。")
async def handle_func(event: Event):
Number = eval(str(event.get_message()))
output_list = []
# 判断数字大于列表索引就重来
# try:
while len(output_list) < Number:

MapN = random.choice(MapList) # 返回列表中的随机项

if MapN not in output_list:
message = MapN

path = Path(os.getcwd() + f"/love/data/images/match/{MapN}").parent / f"{MapN}"

image = MessageSegment.image(path)

output_list.append(MapN)

await MatchMap.send("呐呐~你抽到的地图为:" + message.replace('.png', '') + image)

await MatchMap.finish("抽图结束,祝您比赛愉快")